package com.dayu.design.结构型.组合模式;

import java.util.ArrayList;
import java.util.List;

/**
 * 先看看组合模式的定义吧：“将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象
 * 的使用具有一致性。”
 * <p>
 * 就拿剪发办卡的事情来分析一下吧。
 * <p>
 * 首先，一张卡可以在总部，分店，加盟店使用，那么总部可以刷卡，分店也可以刷卡，加盟店也可以刷卡，这个属性结构的店面层级关系就明确啦。
 * <p>
 * 那么，总店刷卡消费与分店刷卡消费是一样的道理，那么总店与分店对会员卡的使用也具有一致性。
 */
public class GroupDemo {
    public static void main(String[] args) {
        Composite rootComposite = new Composite();
        rootComposite.name = "根节点";

        Composite composite1 = new Composite();
        composite1.name = "左节点";

        Composite composite2 = new Composite();
        composite2.name = "右节点";

        Leaf leaf1 = new Leaf();
        leaf1.name = "右-子节点1";

        Leaf leaf2 = new Leaf();
        leaf2.name = "右-子节点2";

        composite2.add(leaf1);
        composite2.add(leaf2);

        rootComposite.add(composite1);
        rootComposite.add(composite2);

        rootComposite.eachChild();
    }
}

abstract class Component {
    String name;

    public abstract void add(Component c);

    public abstract void remove(Component c);

    public abstract void eachChild();
}

//组合部件类
class Leaf extends Component {

    @Override
    public void add(Component c) {
        System.out.println("");
    }

    @Override
    public void remove(Component c) {
        System.out.println("");
    }

    @Override
    public void eachChild() {
        System.out.println(name + "执行了");
    }
}

class Composite extends Component {
    //用来保存节点的子节点
    List<Component> list = new ArrayList<>();

    //添加节点
    @Override
    public void add(Component c) {
        list.add(c);
    }

    //删除节点
    @Override
    public void remove(Component c) {
        list.remove(c);
    }

    //遍历子节点
    @Override
    public void eachChild() {
        System.out.println(name + "执行了");
        for (Component c : list) {
            c.eachChild();
        }
    }
}
